{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Logistic Regression (Classification Algorithm) Exercise with Titanic data\n",
    "\n",
    "<b>Goal</b>: Predict survival based on passenger characteristics. 1 is survived and 0 is not. As this is a logistic regression exercise, use a logistic regression model to accomplish this goal. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load Data\n",
    "\n",
    "`titanic.csv` is in the data folder. The data is from Kaggle's Titanic competition. Information on the data is available [here](https://www.kaggle.com/c/titanic/data)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PassengerId</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Braund, Mr. Owen Harris</td>\n",
       "      <td>male</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>A/5 21171</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
       "      <td>female</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>PC 17599</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C85</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>Heikkinen, Miss. Laina</td>\n",
       "      <td>female</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>STON/O2. 3101282</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
       "      <td>female</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>113803</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>C123</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Allen, Mr. William Henry</td>\n",
       "      <td>male</td>\n",
       "      <td>35.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>373450</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             Survived  Pclass  \\\n",
       "PassengerId                     \n",
       "1                   0       3   \n",
       "2                   1       1   \n",
       "3                   1       3   \n",
       "4                   1       1   \n",
       "5                   0       3   \n",
       "\n",
       "                                                          Name     Sex   Age  \\\n",
       "PassengerId                                                                    \n",
       "1                                      Braund, Mr. Owen Harris    male  22.0   \n",
       "2            Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0   \n",
       "3                                       Heikkinen, Miss. Laina  female  26.0   \n",
       "4                 Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0   \n",
       "5                                     Allen, Mr. William Henry    male  35.0   \n",
       "\n",
       "             SibSp  Parch            Ticket     Fare Cabin Embarked  \n",
       "PassengerId                                                          \n",
       "1                1      0         A/5 21171   7.2500   NaN        S  \n",
       "2                1      0          PC 17599  71.2833   C85        C  \n",
       "3                0      0  STON/O2. 3101282   7.9250   NaN        S  \n",
       "4                1      0            113803  53.1000  C123        S  \n",
       "5                0      0            373450   8.0500   NaN        S  "
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# You might have to figure out what other import statements you need\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from sklearn import metrics\n",
    "import seaborn as sns\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# This is because we need to scale our algorithm\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# Figure out what to import the csv file \n",
    "df = pd.read_csv('data/titanic.csv', index_col='PassengerId')\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Arrange Data into Features Matrix and Target Vector\n",
    "Make at least 4 features (Use at least Age and Sex columns) for your X. Make **Survived** series as the target. Keep in mind that one of the features (Age) has nans in them (meaning you need to either remove rows in the dataset with nans or impute them). Sex also needs to be transformed into 1's and 0's (strings are not an acceptable input for a model). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# You will have to transform Sex into a non text form.\n",
    "# I choose four features, you could have chosen others\n",
    "feature_cols = ['Pclass', 'Parch', 'Age', 'Sex']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Transform Sex Column Values "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Make sex into something you can feed into a model\n",
    "# Has \n",
    "df['Sex'] = df.Sex.map({'male': 0, \n",
    "                                  'female': 1})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"\\ngenderMapping = {'male': 0,\\n                 'female':1}\\ntitanic.loc[:, 'Sex'] = titanic.loc[:,'Sex'].apply(lambda x: genderMapping.get(x))\\n\\n\""
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# You could also have mapped gender using the code below. \n",
    "\"\"\"\n",
    "genderMapping = {'male': 0,\n",
    "                 'female':1}\n",
    "titanic.loc[:, 'Sex'] = titanic.loc[:,'Sex'].apply(lambda x: genderMapping.get(x))\n",
    "\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Remove or Impute missing values for the Age Column"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Impute age with mean (this could introduce error)\n",
    "# df.loc[df.Age.isna(), 'Age'] = np.floor(df.Age.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Remove rows where age is nan from the dataset\n",
    "df = df.loc[~df['Age'].isnull(), :]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Create X and y**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = df.loc[:, feature_cols]\n",
    "\n",
    "y = df['Survived']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Split the data into training and testing sets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X,\n",
    "                                                    y,\n",
    "                                                    random_state = 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Standardize Data\n",
    "Standardization of a dataset is a common requirement for many machine learning estimators: they might behave badly if the individual features do not more or less look like standard normally distributed data. You can standardize features by removing the mean and scaling to unit variance\n",
    "\n",
    "The standard score of a sample x is calculated as:\n",
    "\n",
    "z = (x - mean) / std\n",
    "\n",
    "The code below uses StandardScaler to accomplish this. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "scaler = StandardScaler()\n",
    "\n",
    "# Fit on training set only.\n",
    "scaler.fit(X_train)\n",
    "\n",
    "# Apply transform to both the training set and the test set.\n",
    "X_train = scaler.transform(X_train)\n",
    "X_test = scaler.transform(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Fit a Logistic Regression (This is a classification algorithm)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Keep in mind that Logistic regression is NOT A REGRESSION ALGORITHM"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<b>Step 1:</b> Import the model you want to use\n",
    "\n",
    "In sklearn, all machine learning models are implemented as Python classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<b>Step 2:</b> Make an instance of the Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "logreg = LogisticRegression()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<b>Step 3:</b> Training the model on the data, storing the information learned from the data. Model is learning the relationship between features and labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression()"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "logreg.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<b>Step 4:</b> Predict the labels of new data (new passengers)\n",
    "\n",
    "Uses the information the model learned during the model training process"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1,\n",
       "       1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1,\n",
       "       0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1,\n",
       "       1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,\n",
       "       1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0,\n",
       "       1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0,\n",
       "       1, 1, 0])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Returns a NumPy Array\n",
    "# Predict for One Observation (image)\n",
    "logreg.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Make predictions on the testing set and calculate the accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# class predictions (not predicted probabilities)\n",
    "predictions = logreg.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# calculate classification accuracy\n",
    "score = logreg.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8156424581005587"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "score"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Compare your testing accuracy to the null accuracy\n",
    "Null accuracy is usually considered the accuracy obtained by always predicting the most frequent class.\n",
    "\n",
    "When interpreting the predictive power of a model, it's best to compare it to a baseline using a dummy model, sometimes called a baseline model. A dummy model is simply using the mean, median, or most common value as the prediction. This forms a benchmark to compare your model against and becomes especially important in classification where your null accuracy might be 95 percent.\n",
    "\n",
    "For example, suppose your dataset is **imbalanced** -- it contains 99% one class and 1% the other class. Then, your baseline accuracy (always guessing the first class) would be 99%. So, if your model is less than 99% accurate, you know it is worse than the baseline. Imbalanced datasets generally must be trained differently (with less of a focus on accuracy) because of this."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    103\n",
       "1     76\n",
       "Name: Survived, dtype: int64"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5754189944134078"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "103 / (103 + 76)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since this particular model has an accuracy of roughly x%. By comparison, the null accuracy was 57.54%. The model provides some value. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Confusion matrix of Titanic predictions\n",
    "\n",
    "A confusion matrix is a table that is often used to describe the performance of a classification model (or \"classifier\") on a set of test data for which the true values are known. Hint you might wish to consider googling this one if you don't know how to do it. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "cm = metrics.confusion_matrix(y_test, predictions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2.5, -0.5)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 648x648 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(9,9))\n",
    "sns.heatmap(cm, annot=True,\n",
    "            fmt=\".0f\",\n",
    "            linewidths=.5,\n",
    "            square = True,\n",
    "            cmap = 'Blues');\n",
    "plt.ylabel('Actual label');\n",
    "plt.xlabel('Predicted label');\n",
    "plt.title('Accuracy Score: {0}'.format(score), size = 15);\n",
    "\n",
    "# You can comment out the next 4 lines if you like\n",
    "b, t = plt.ylim() # discover the values for bottom and top\n",
    "b += 0.5 # Add 0.5 to the bottom\n",
    "t -= 0.5 # Subtract 0.5 from the top\n",
    "plt.ylim(b, t) # update the ylim(bottom, top) values"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
